package modulos;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import entities.ItemMateriaPrimaRodamiento;
import entities.ItemOrdenCompraCCVO;
import entities.MateriaPrimaAPedirVO;
import entities.MateriaPrimaVO;
import entities.OrdenCompraCCVO;
import entities.Rodamiento;
import entities.RodamientoVO;

@Stateless
public class AdmVentasBean implements AdmVentas {

    
    @EJB
    private AdmRodamientos administradorRodamientos;
    @EJB
    private AdmMateriaPrima administradorMateriaPrima;
    
    public AdmVentasBean() {
    }
    
	@Override
	public List<MateriaPrimaAPedirVO> venderRodamientos(OrdenCompraCCVO ordenCompraCC) {
		List<MateriaPrimaVO> listaMaterias = administradorMateriaPrima.getMateriasPrima();
		HashMap<MateriaPrimaVO, Integer> hashMateriasPrimasNecesarias = new HashMap<MateriaPrimaVO, Integer>();
		List<MateriaPrimaAPedirVO> listaMateriaPrimaAPedir = new ArrayList<MateriaPrimaAPedirVO>();
		for (ItemOrdenCompraCCVO itemOrdenCompraCCVO : ordenCompraCC.getItemsOCCC()) {
			RodamientoVO rodamientoVO = itemOrdenCompraCCVO.getRodamiento();
			Rodamiento rodamiento = administradorRodamientos.buscarRodamiento(rodamientoVO);
			Integer cantidadRodamiento = itemOrdenCompraCCVO.getCantidad();
			for (ItemMateriaPrimaRodamiento itemMateriaPrimaRodamiento : rodamiento.getListaMateriasPrima()) {
				Integer cantidadMateriaPrimaNecesaria = (itemMateriaPrimaRodamiento.getCantidad())*cantidadRodamiento;
				for (MateriaPrimaVO materiaPrimaVO : listaMaterias) {
					if(materiaPrimaVO.getCodigo().equalsIgnoreCase(itemMateriaPrimaRodamiento.getMateriaPrima().getCodigo())){
						if(cantidadMateriaPrimaNecesaria>materiaPrimaVO.getStock()){
							Integer cantidadAPedir = cantidadMateriaPrimaNecesaria-materiaPrimaVO.getStock();
							materiaPrimaVO.setStock(0);
							Integer cantidadAcumulada = hashMateriasPrimasNecesarias.get(materiaPrimaVO);
							if(cantidadAcumulada!=null)
								cantidadAcumulada+=cantidadAPedir;
							else
								cantidadAcumulada=cantidadAPedir;
							hashMateriasPrimasNecesarias.put(materiaPrimaVO, cantidadAcumulada);
						}else{
							materiaPrimaVO.setStock(materiaPrimaVO.getStock()-cantidadMateriaPrimaNecesaria);
						}
					}
				}
			}
		}
		for (MateriaPrimaVO materiaPrimaVO : listaMaterias) {
			administradorMateriaPrima.updateMateriaPrima(materiaPrimaVO);
		}
		
		if(!hashMateriasPrimasNecesarias.isEmpty()){
			MateriaPrimaAPedirVO materiaPrimaAPedirVO = new MateriaPrimaAPedirVO();
			for(MateriaPrimaVO materiaPrimaVO : hashMateriasPrimasNecesarias.keySet()){
				Integer cantidad = hashMateriasPrimasNecesarias.get(materiaPrimaVO);
				materiaPrimaAPedirVO.setCantidad(cantidad);
				materiaPrimaAPedirVO.setMateriaPrimaVO(materiaPrimaVO);
				listaMateriaPrimaAPedir.add(materiaPrimaAPedirVO);
			}
		}
		return listaMateriaPrimaAPedir;
	}

}
